package com.fat.thegioivere.network;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;

import com.fat.thegioivere.controller.DataRequestCallback;
import com.fat.thegioivere.controller.ThreadManager;
import com.fat.thegioivere.model.NewsItem;
import com.fat.thegioivere.utility.Constants;
import com.fat.thegioivere.utility.HttpUtils;
import com.fat.thegioivere.utility.Utils;

/**
 * Cung cấp các phương thức request dữ liệu từ web api. Dữ liệu trả về thông qua
 * các callback kèm theo param của function
 * 
 * @author Trinh Minh Soan (tmsoan@gmail.com)
 * 
 */

public class TGVeReRequests {

	private static final String TAG = "TGVeReRequests";

	/**
	 * Request thành công
	 */
	private static final int STATUS_SUCCESS = 1;

	/**
	 * URL để request tin tức du lịch
	 */
	private static final String URL_GET_TRAVEL_LIST = "";

	/**
	 * URL để request tin tức nghiệp vụ
	 */
	private static final String URL_GET_BUSINESS_LIST = "";

	/**
	 * URL để request mục tin tức
	 */
	private static final String URL_GET_NEWS_LIST = "";

	/**
	 * Lấy danh sách tin tức
	 */
	public static void getDataList(final Context context,
			final boolean forceUpdate, final int requestType,
			final DataRequestCallback<ArrayList<NewsItem>> onDataListResult) {

		final ThreadManager atm = ThreadManager.getInstance(context);
		int priority;
		if (forceUpdate) {
			priority = ThreadManager.PRIORITY_BLOCKING;
		} else {
			priority = ThreadManager.PRIORITY_NORMAL;
		}

		atm.execute(new Runnable() {

			@Override
			public void run() {
				// TGVeReDataCache dataCache =
				// TGVeReDataCache.getInstance(context);
				ArrayList<NewsItem> mNewItems;
				boolean needToRequestServer = true;

				if (!forceUpdate) {
					// Kiểm tra dữ liệu trong cache
					// ... đọc data từ cache
					// Nếu có dữ liệu trong cache thì gọi cập nhật giao diện
					// atm.callbackOnUIThread(onTravelListResult, mNewItems,
					// needToRequestServer);
				}

				if (forceUpdate || needToRequestServer) {
					String url = "";
					switch (requestType) {
					case Constants.REQ_BUSINESS:
						url = URL_GET_BUSINESS_LIST;
						break;
					case Constants.REQ_NEWS:
						url = URL_GET_NEWS_LIST;
						break;
					case Constants.REQ_TRAVEL:
						url = URL_GET_TRAVEL_LIST;
						break;
					case 0:
						url = "http://thegioivere.net/service/station";
						break;
					}

					// Lấy dữ mới nhất nhật từ server
					mNewItems = new ArrayList<NewsItem>();
					try {
						// kiểm tra tình trạng kết nối trước...
						String response = HttpUtils.requestHttpGET(url);
						if (response == null) {
							atm.callbackOnUIThread(onDataListResult, null,
									false);
							return;
						}
						JSONObject jsonObject = new JSONObject(response);
						if (STATUS_SUCCESS == jsonObject.getInt("status")) {
							JSONArray filmInfoArr = jsonObject
									.getJSONArray("result");
							int length = filmInfoArr.length();
							for (int i = 0; i < length; i++) {
								// phân tích JSON và add vào list
								// ...
								mNewItems.add(new NewsItem());
							}
							// Cập nhật lại cache
							// dataCache.saveTravelList(mNewItems);
							atm.callbackOnUIThread(onDataListResult, mNewItems,
									false);
						}
					} catch (JSONException e) {
						Utils.myLogger.error(TAG, Log.getStackTraceString(e));
					}
				}
			}
		}, priority);
	}

	/**
	 * Lấy danh sách các tin tức du lịch
	 */
	public static void getTravelList(final Context context,
			final boolean forceUpdate,
			final DataRequestCallback<ArrayList<NewsItem>> onTravelListResult) {

		final ThreadManager atm = ThreadManager.getInstance(context);

		int priority;
		if (forceUpdate) {
			priority = ThreadManager.PRIORITY_BLOCKING;
		} else {
			priority = ThreadManager.PRIORITY_NORMAL;
		}

		atm.execute(new Runnable() {

			@Override
			public void run() {
				// TGVeReDataCache dataCache =
				// TGVeReDataCache.getInstance(context);
				ArrayList<NewsItem> mNewItems;
				boolean needToRequestServer = true;

				if (!forceUpdate) {
					// Kiểm tra dữ liệu trong cache
					// ... đọc data từ cache
					// Nếu có dữ liệu trong cache thì gọi cập nhật giao diện
					// atm.callbackOnUIThread(onTravelListResult, mNewItems,
					// needToRequestServer);
				}

				if (forceUpdate || needToRequestServer) {
					// Lấy dữ mới nhất nhật từ server
					mNewItems = new ArrayList<NewsItem>();
					String url = URL_GET_TRAVEL_LIST;

					try {
						// kiểm tra tình trạng kết nối trước...
						String response = HttpUtils.requestHttpGET(url);
						if (response == null) {
							atm.callbackOnUIThread(onTravelListResult, null,
									false);
							return;
						}
						JSONObject jsonObject = new JSONObject(response);
						if (STATUS_SUCCESS == jsonObject.getInt("status")) {
							JSONArray filmInfoArr = jsonObject
									.getJSONArray("result");
							int length = filmInfoArr.length();
							for (int i = 0; i < length; i++) {
								// phân tích JSON và add vào list
								// ...
								mNewItems.add(new NewsItem());
							}
							// Cập nhật lại cache
							// dataCache.saveTravelList(mNewItems);
							atm.callbackOnUIThread(onTravelListResult,
									mNewItems, false);
						}
					} catch (JSONException e) {
						Utils.myLogger.error(TAG, Log.getStackTraceString(e));
					}
				}
			}
		}, priority);
	}

	/**
	 * Lấy danh sách các tin tức nghiệp vụ
	 */
	public static void getBusinessList(final Context context,
			final boolean forceUpdate,
			final DataRequestCallback<ArrayList<NewsItem>> onBusinessListResult) {
		final ThreadManager atm = ThreadManager.getInstance(context);

		int priority;
		if (forceUpdate) {
			priority = ThreadManager.PRIORITY_BLOCKING;
		} else {
			priority = ThreadManager.PRIORITY_NORMAL;
		}

		atm.execute(new Runnable() {

			@Override
			public void run() {
				// TGVeReDataCache dataCache =
				// TGVeReDataCache.getInstance(context);
				ArrayList<NewsItem> mNewItems;
				boolean needToRequestServer = true;

				if (!forceUpdate) {
					// Kiểm tra dữ liệu trong cache
					// ... đọc data từ cache
					// Nếu có dữ liệu trong cache thì gọi cập nhật giao diện
					// atm.callbackOnUIThread(onTravelListResult, mNewItems,
					// needToRequestServer);
				}

				if (forceUpdate || needToRequestServer) {
					// Lấy dữ mới nhất nhật từ server
					mNewItems = new ArrayList<NewsItem>();
					String url = URL_GET_BUSINESS_LIST;

					try {
						// kiểm tra tình trạng kết nối trước...
						String response = HttpUtils.requestHttpGET(url);
						if (response == null) {
							atm.callbackOnUIThread(onBusinessListResult, null,
									false);
							return;
						}
						JSONObject jsonObject = new JSONObject(response);
						if (STATUS_SUCCESS == jsonObject.getInt("status")) {
							JSONArray filmInfoArr = jsonObject
									.getJSONArray("result");
							int length = filmInfoArr.length();
							for (int i = 0; i < length; i++) {
								// phân tích JSON và add vào list
								// ...
								mNewItems.add(new NewsItem());
							}
							// Cập nhật lại cache
							// dataCache.saveTravelList(mNewItems);
							atm.callbackOnUIThread(onBusinessListResult,
									mNewItems, false);
						}
					} catch (JSONException e) {
						Utils.myLogger.error(TAG, Log.getStackTraceString(e));
					}
				}
			}
		}, priority);
	}

	/**
	 * Lấy danh sách các mục tin tức
	 */
	public static void getNewsList(final Context context,
			final boolean forceUpdate,
			final DataRequestCallback<ArrayList<NewsItem>> onNewsListResult) {
		final ThreadManager atm = ThreadManager.getInstance(context);

		int priority;
		if (forceUpdate) {
			priority = ThreadManager.PRIORITY_BLOCKING;
		} else {
			priority = ThreadManager.PRIORITY_NORMAL;
		}

		atm.execute(new Runnable() {

			@Override
			public void run() {
				// TGVeReDataCache dataCache =
				// TGVeReDataCache.getInstance(context);
				ArrayList<NewsItem> mNewItems;
				boolean needToRequestServer = true;

				if (!forceUpdate) {
					// Kiểm tra dữ liệu trong cache
					// ... đọc data từ cache
					// Nếu có dữ liệu trong cache thì gọi cập nhật giao diện
					// atm.callbackOnUIThread(onTravelListResult, mNewItems,
					// needToRequestServer);
				}

				if (forceUpdate || needToRequestServer) {
					// Lấy dữ mới nhất nhật từ server
					mNewItems = new ArrayList<NewsItem>();
					String url = URL_GET_NEWS_LIST;

					try {
						// kiểm tra tình trạng kết nối trước...
						String response = HttpUtils.requestHttpGET(url);
						if (response == null) {
							atm.callbackOnUIThread(onNewsListResult, null,
									false);
							return;
						}
						JSONObject jsonObject = new JSONObject(response);
						if (STATUS_SUCCESS == jsonObject.getInt("status")) {
							JSONArray filmInfoArr = jsonObject
									.getJSONArray("result");
							int length = filmInfoArr.length();
							for (int i = 0; i < length; i++) {
								// phân tích JSON và add vào list
								// ...
								mNewItems.add(new NewsItem());
							}
							// Cập nhật lại cache
							// dataCache.saveTravelList(mNewItems);
							atm.callbackOnUIThread(onNewsListResult, mNewItems,
									false);
						}
					} catch (JSONException e) {
						Utils.myLogger.error(TAG, Log.getStackTraceString(e));
					}
				}
			}
		}, priority);
	}

}
